﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using OpenTK.Graphics.OpenGL;
public unsafe class Triangulo : IEntidad
{
    float[] arrTriangulo;

	//=================
	//constructores
	//=================
    public Triangulo(Coordenada objLocalizacion, float pintLargo, float pintAlto)
	{
		this._largo = pintLargo;
		this._alto = pintAlto;
        this._localizacion = objLocalizacion;
        arrTriangulo = new float[9];
        relocalizarTriangulo();
	}
	//Manual
	public Triangulo()
	{
        arrTriangulo = new float[9];
	}

	//=================
	//propiedades
	//=================
	private Colores _coloreadoBorde;
	public Colores ColoreadoBorde {
		get { return _coloreadoBorde; }
		set { _coloreadoBorde = value; }
	}

	private Estilo.Borde _tipoBorde;
	public Estilo.Borde TipoBorde {
		get { return this._tipoBorde; }
		set { this._tipoBorde = value; }
	}

	private Estilo.Forma _tipoForma;
	public Estilo.Forma TipoForma {
		get { return this._tipoForma; }
		set { this._tipoForma = value; }
	}

	private string _id;
	public string ID {
		get { return _id; }
		set { _id = value; }
	}

	private bool _visible;
	public bool Visible {
		get { return _visible; }
		set { _visible = value; }
	}

	private Coordenada _localizacion;
	public Coordenada Localizacion {
		get { return _localizacion; }
		set { _localizacion = value;
            relocalizarTriangulo();
        }
	}

	private Colores _coloreado;
	public Colores Coloreado {
		get { return _coloreado; }
		set { _coloreado = value; }
	}

    private float _largo;
    public float Largo
    {
		get { return _largo; }
		set { _largo = value;
              relocalizarTriangulo();
        }
	}

    private float _alto;
    public float Alto
    {
		get { return _alto; }
		set { 
            _alto = value;
            relocalizarTriangulo();
        }
	}

	private bool _espejo;
	public bool Espejo {
		get { return this._espejo; }
		set { this._espejo = value; }
	}

    private float _grosor;
    public float Grosor
    {
        get { return _grosor; }
        set { _grosor = value; }
    }

    private Capa _capa;
    public Capa CapaCanvas
    {
        get { return _capa; }
        set { _capa = value; }
    }

    private string _tabla;
    public string Tabla
    {
        get { return _tabla; }
        set { _tabla = value; }
    }


    protected void relocalizarTriangulo()
    {
        arrTriangulo[0] = _localizacion.X - (this.Largo / 2.0f);
        arrTriangulo[1] = _localizacion.Y - (this.Alto / 2.0f);
        arrTriangulo[2] = _localizacion.Z;
        arrTriangulo[3] = _localizacion.X;
        arrTriangulo[4] = _localizacion.Y + (this.Alto / 2.0f);
        arrTriangulo[5] = _localizacion.Z;
        arrTriangulo[6] = _localizacion.X + (this.Largo / 2.0f);
        arrTriangulo[7] = _localizacion.Y - (this.Alto / 2.0f);
        arrTriangulo[8] = _localizacion.Z;
    }

    public void setParams(float pLargo, float pAlto, Coordenada pCoordenada)
    {
        this._largo = pLargo;
        this._alto = pAlto;
        this._localizacion = pCoordenada;
        relocalizarTriangulo();
    }

	public unsafe void _pintar()
	{
        fixed (float* apuntapunto = &arrTriangulo[0])
        {
            GL.EnableClientState(ArrayCap.ColorArray);
            if (this.CapaCanvas == null)
            {
                GL.ColorPointer(4, ColorPointerType.Float, 0, (IntPtr)this.Coloreado.ArregloColores());
            }
            else
            {
                GL.ColorPointer(4, ColorPointerType.Float, 0, (IntPtr)this.CapaCanvas.Coloreado.ArregloColores());
            }
            GL.EnableClientState(ArrayCap.VertexArray);
            GL.VertexPointer(3, VertexPointerType.Float, 0, (IntPtr)apuntapunto);
            GL.DrawArrays(BeginMode.Triangles, 0, 3);
            GL.DisableClientState(ArrayCap.VertexArray);
            GL.DisableClientState(ArrayCap.ColorArray);
            GL.Flush();
        }
	}
}
